#pragma once
#include "../event.h"
#include <fcntl.h>
namespace TinyRPC{
class EventLoop;
// AbstractChannel 控制了Fd, EventPtr 的生命周期
// 文件描述符的周期
enum FdStatus{
    OPEN,
    CLOSED
};


class AbstractChannel{
public:
   
    
    // 删除读写事件， 一次可以删除两个事件
    void deleteEvent(EventLoop * ownerLoop,  int interestOp);

    // 添加 修改读写事件， 一次只能添加一个事件
    void updateEvent(int interestOp, const Task& task, EventLoop * ownerLoop);
    EventPtr getEventPtr(){return m_event;}

    int getFd(){return m_fd;}
    bool setBlock(bool isblock);
    void close();

private:
    void addEvent(EventLoop * ownerLoop);
    void modifyEvent(EventLoop * ownerLoop);

protected:
    AbstractChannel(int fd);
    virtual ~AbstractChannel();
    EventPtr m_event;
    int m_fd;
    FdStatus m_fdStatus;

};
}
